#include "dev_timer_interrupt.h"

#ifdef STM32_TIM2_INT

// TIM2中断初始化函数
// frequency：定时器中断频率
void tim2_int_init(uint16 frequency)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
    uint16 psc = SYSCLK_FREQ / 50000;
    uint16 arr = 50000 / frequency;
    
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_TimeBaseStructure.TIM_Period = arr; // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; // 设置用来作为TIMx时钟频率除数的预分频值(分频系数)
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上计数模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);	// 允许更新中断
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // TIM2中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能IRQ通道
	NVIC_Init(&NVIC_InitStructure); // 根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
	
	TIM_Cmd(TIM2, ENABLE); // 使能TIMx外设
}

// TIM2中断服务函数，编写时注意名称，因为名称是向量表固定的
//void TIM2_IRQHandler(void)   
//{
//	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 检查指定的TIM中断发生与否:TIM 中断源 
//	{
//		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除TIMx的中断待处理位:TIM 中断源 
//        // 中断服务函数内容添加
//        // ...
//	}
//}

#endif

// 定时器中断初始化
// 根据头文件的宏来选择使用其中某一个定时器
// arr：自动重装值
// psc：时钟预分频数
void tim_int_init(uint16 frequency)
{
#ifdef STM32_TIM2_INT
    tim2_int_init(frequency);
#endif
}
